1.1.2•Updated a month ago
import { FreshContext } from "$fresh/server.ts";
import { Package } from "$classes/package.ts";
import { ExtractFile } from "@components/package/files/Code.tsx";
import { PackageTab } from "$types/package_tabs.enum.ts";
import { User } from "$classes/user.ts";
import { Token } from "$classes/token.ts";
export async function handler(req: Request, ctx: FreshContext<Viapak.Package.State>) {
const pathname = new URL(req.url).pathname;
const namespace = ctx.params.namespace;
const name = ctx.params.package;
const version = ctx.params.version || 'latest';
// Find package
const _package = await Package.FindByPath(`@${namespace}/${name}@${version}`);
if(!_package) return new Response(null, {
headers: {
Location: '/'
},
status: 307
});
// Set up tabs
let tab = PackageTab.README;
const query_tab = ctx.url.searchParams.get('tab')! as PackageTab;
if(Object.values(PackageTab).includes(query_tab)) tab = query_tab;
if(ExtractFile(pathname, _package)) tab = PackageTab.BROWSE;
// UI Errors
let error: string | undefined;
if(!_package.versions.all.includes(_package.versions.current!)) {
error = `${_package.namespace}/${_package.name} does not have a version "${_package.versions.current}"`;
_package.versions.current = _package.versions.latest;
}
// Token+User references
const tokens = await Token.find({
uuid: { $in: _package.events.map(e => e.token) },
});
const users = await User.find({
$relationship: {
via: Token,
match: { uuid: { $in: _package.events.map(e => e.token) } },
select: 'user_id'
}
});
// Context
ctx.state.pathname = pathname;
ctx.state.tab = tab;
ctx.state.error = error;
ctx.state._package = _package;
ctx.state.users = users;
ctx.state.tokens = tokens;
ctx.state.token_users = Object.assign({}, ...tokens.map(({ uuid, user_id }) => ({[uuid]: users.find(u => u.id == user_id) || null})));
return ctx.next();
}